formatter = "%s %s %s %s"

puts formatter % [1,2,3,4]
puts formatter % ["one", "two", "three", "four"]
puts formatter % [true, false, false, true]
puts formatter % [formatter,formatter,formatter,formatter]
puts formatter % [
   "I had this thing.",
   "That you could type up right.",
   "But it didn't sing.",
   "So I said goodnight."
]


#还是印出部分，先是表明了formatter是一个变数，里面包含四个%s,然后在后面又将%s转变成为另一个字符串变数并进行赋值，例如前面的三个，在这个变数里面同样可以把自己本身作为子函数，此时里面未定义的%s就直接打印出来，行成一列的%s %s %s ...同样的后面的%s也可以作为字符串变数，直接把字符串用引号收起来就行

#你可能大概知道这是个什么意思了，但说不出来，而且概念中有错
#首先，你不要总想什么变数，赋值这种东西， formatter = "%s %s %s %s"这并不是什么特殊的东西，这么做了之后， 你就可以把formatter当"%s %s %s %s"看，好像你在做数学题时，设x = 3这种，你这就是设了一个未知数（它已知了，都有值了，但你明白是这个意思），然后后面你在做题的时候用到x，那就是用到3了，对吧？
#所以，你这小心翼翼地强调”表明formatter是一个变数“什么的显得太小心了，你现在就先把formatter当成后面那个字符串，就行了

#通过那后面的使用，你也应该 看得出来， 格式 化字符串，并不特殊，mtter % [formatter,formatter,formatter,formatter]
#这个时候，第一个formatter是作为格式化字符串，但后面的几个，就是作为普通的字符串，所以，格式化不格式化，这是因为puts这个方法内部将一个字符串”当成“了一个格式化字符串，而已，你要理解这个本质，本质上，它就只是一个平常的字符串，只不过因为当中含有%s, %d这种占位符， 有些方法比如puts（其实你也可以自己实现一个类似的方法）将其占位符的内容替换掉而已

#如果我定义这么一个方法
#def test(formatter, values)
# return formatter.gsub(/%d/, "Hello, ")
#end
#那么如果你这样调用它test("%d, world")得到的是"Hello, world"
#你puts test("%d, world")输出就是Hello, world
#在这个test 方法里，我就相当于是把你传进来的formatter参数作为一个格式化字符串了，我只不过把其中的%d内容替换成Hello,了，当然我这个方法写得太烂了，实际中不可能会出现这样的代码，但就是这个意思，当然，这里面涉及到正则表达式的内容，你能理解就理解吧，gsub方法其实就是String上的一个方法，没什么特别的，你也可以看一看它的api文档。
